/**
 * @author F.biz - http://www.fbiz.com.br/
 */
/**
 * @author	Nicholas Almeida
 * @author	Marcelo Carneiro
 * @version	4.2.0
 */
function isDef(S) {
    return (eval('typeof(' + S + ')') != 'undefined' && eval('typeof(' + S + ')') != 'unknown');
};
function gElm(id) {
    return (is.ie4) ? document.all[id] : document.getElementById(id);
};
if(!isDef('$')) var $ = gElm;
function checkBrowser() {
    var T = this;
    var b = navigator.appName;
    var v = navigator.appVersion;
    var u = navigator.userAgent;
    if (u == null)return;
    if (b == 'Netscape')T.b = 'ns';
    else if (b == 'Microsoft Internet Explorer')T.b = 'ie';
    else T.b = b;
	if (u.indexOf('Safari')>=0) T.b = 'sa';
    T.v = parseInt(v);
    T.sa = (T.b == 'sa');
    T.ns = (T.b == 'ns' && T.v >= 4);
    T.ns4 = (T.b == 'ns' && T.v == 4);
    T.ns5 = (T.b == 'ns' && T.v == 5);
    T.ns6 = (T.b == 'ns' && T.v == 5);
    T.ie = (T.b == 'ie' && T.v >= 4);
    T.ie4 = (u.indexOf('MSIE 4') > 0);
    T.ie5 = (u.indexOf('MSIE 5.0') > 0);
    T.ie55 = (u.indexOf('MSIE 5.5') > 0);
    T.ie6 = (u.indexOf('MSIE 6.0') > 0);
    T.ie7 = (u.indexOf('MSIE 7') > 0);
    if (T.ie5)T.v = 5;
    if (T.ie55)T.v = 5.5;
    if (T.ie6)T.v = 6;
    if (T.ie7)T.v = 7;
    T.min = (T.ns || (T.ie && T.v >= 6));
    T.dom = (T.v >= 5);
    T.win = (u.indexOf('Win') > 0);
    T.mac = (u.indexOf('Mac') > 0);
};
var is =  new checkBrowser();
function openPop(u, n, w, h, c, s, o) {
    var l = 18;
    var t = 18;
    if (c) {
        l = (screen.availWidth - w)/2;
		t = (screen.availHeight -h)/2;
    }
	var popup = window.open(u, n, 'width=' + w + ', height=' + h + ', left=' + l + ', top=' + t + ', scrollbars=' + ((s) ? 'yes' : 'no') + ((o) ? ', ' + o : ''));
	setTimeout(function(){
		try {
			popup.focus();
			return false;
		} catch(error) {
			alert('Você deve desabilitar o recurso de anti pop-up para acessar este link.');
			return false;
		}
	}, 300);
    return false;
};
var iimg_off;
var iimg_over;
function pImg(src) {
    var obj = src.substring(src.lastIndexOf('/') + 1, src.lastIndexOf('.'));
    eval('i' + obj + '= new Image()');
    eval('i' + obj + '.src="' + src + '"');
};
function cImg(id, obj) {
    var tId = 'document.images[\'' + id + '\']';
    if (isDef(tId) && isDef('i' + obj))eval(tId).src = eval('i' + obj).src;
};
function sDiv(id,s) {
	var e = typeof(id) == 'object' ? id :  $(id);
    e.style.display = s ? s : 'block';
};
function hDiv(id,s) {
	var e = typeof(id) == 'object' ? id :  $(id);
    e.style.display = s ? s : 'none';
};
function shDiv(id) {
	var e = typeof(id) == 'object' ? id :  $(id);
    if (e.style.display == 'block' || !e.style.display) e.style.display = 'none';
    else e.style.display = 'block';
};
function addEvent(w, e, f, useCapture) {
	if (w.addEventListener) {
		w.addEventListener(e,f,useCapture);
		return true;
	} else if (w.attachEvent) {
		return w.attachEvent('on'+e,f);;
	} else {
		w['on'+e] = f;
		return ((w['on'+e] == null) ? false : true);
	}
	return false;
};
function delEvent(w,e,f,useCapture){
	if(w.detachEvent){
		w.detachEvent('on'+e, f);
		return true;
	}else if(w.removeEventListener){
		return w.removeEventListener(e, f, (useCapture || false));
	}else{
		w['on'+e] = null;
		return ((w['on'+e] == null) ? true : false);
	}
	return false;
}
function ie_getElementsByTagName(str) {
	if (str=="*") return document.all;
	else return document.all.tags(str);
};
if(is.ie) document.getElementsByTagName = ie_getElementsByTagName;
function gTag(t,n) {
	if(!n) n = document;
	if(!t) t = '*';
	return n.getElementsByTagName(t);
};
function gClass(c, t, n) {
	var elms = gTag(t, n);
	var cls = [];
	var arrElm = [];
	for (var i = 0; i<elms.length; i++){
		if (elms[i].className.length > 0){
			if (elms[i].className.split(c).length > 1) {
				cls = elms[i].className.split(' ');
				for (var a = 0; a < cls.length; a++){
					if (cls[a] == c){
						arrElm[arrElm.length] = elms[i];
					};
				};
				cls = null;
			};
		};
	};
	return arrElm;
};
function graft(parent, t, doc) {
    doc = (doc || parent.ownerDocument || document);
    var e;

    if(t == 'undefined') {
        throw complaining('Can\'t graft an undefined value');
    } else if(t.constructor == String) {
        e = doc.createTextNode( t );
    } else if(t.length == 0) {
        e = doc.createElement('span');
        e.setAttribute('class', 'fromEmptyLOL');
    } else {
        for(var i = 0; i < t.length; i++) {
            if( i == 0 && t[i].constructor == String ) {
                var snared;
                snared = t[i].match( /^([a-z][a-z0-9]*)\.([^\s\.]+)$/i );
                if( snared ) {
                    e = doc.createElement(   snared[1] );
                    e.setAttribute('class', snared[2] );
                    continue;
                }
                snared = t[i].match( /^([a-z][a-z0-9]*)$/i );
                if( snared ) {
                    e = doc.createElement( snared[1] );  // but no class
                    continue;
                }

                // Otherwise:
                e = doc.createElement('span');
                e.setAttribute('class', 'namelessFromLOL');
            }
            if( t[i] == 'undefined' ) {
                throw complaining('Can\'t graft an undefined value in a list!');
            } else if(  t[i].constructor == String || t[i].constructor == Array ) {
                graft( e, t[i], doc );
            } else if(  t[i].constructor == Number ) {
                graft( e, t[i].toString(), doc );
            } else if(  t[i].constructor == Object ) {
                for(var k in t[i]) {
                    // support for attaching closures to DOM objects
					if(k == 'style' && is.ie) { 
						e.style.cssText = t[i][k]; // correção para IE aplicar o style corretamente.
                    } else if(typeof(t[i][k])=='function'){
                        e[k] = t[i][k]; // aplicar função
                    } else {
						if (k == 'class') e.className = t[i][k]; // correção para o atributo class
						
						e.setAttribute( k, t[i][k] );
                    }
                }
            } else {
                throw complaining('Object ' + t[i] + ' is inscrutable as an graft arglet.');
            }
        }
    }

    parent.appendChild( e );
    return e; // return the topmost created node
};

function complaining (s) { alert("ERROR GRAFT: " + s); return new Error(s); }

function createElm(e, n){
	e = (e || document.body);
	return graft(e, n);
};

function delElm(id){
	var e = typeof(id) == 'object' ? id : $(id);
	try{
		e.parentNode.removeChild(e);
	} catch(e){
		alert("ERROR delElm: " + e.message);
	}
};

function getPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return {x:curleft,y:curtop};
};
function docH(){
	return is.ie ? document.body.scrollHeight : document.height;
};
function docW(){
	return is.ie ? document.body.scrollWidth : document.width;
};

function winW(){return window.innerWidth ? window.innerWidth : document.documentElement.offsetWidth;}
function winH(){return window.innerHeight ? window.innerHeight : document.documentElement.offsetHeight;}

if(is.ie5 || is.ns4) alert('A versão de navegador que você está usando não é compatível com este site.\nAtualize-o para que todos os elementos funcionem corretamente.');

/**************************************
 * UTIL FUNCTIONS
 **************************************/
//{
/**
 *
 *	Init. Executes function(s) on the page load.
 *	
 *	@author Marcelo Miranda Carneiro
 *	@since 15/01/2008
 *	@version 0.1.0
 *	@requires addEvent 
 *	@example
		<code>
			Init.add(FUNCTION_NAME); // for executing before </body>
			Init.addOnLoad(FUNCTION_NAME); // for executing at onLoad function
		</code>
 */
var Init = {
	_functionLoadLst: [],
	_functionOnLoadLst: [],
	add: function($fnc){
		if(typeof($fnc) != 'function')
			return false;
		this._functionLoadLst[this._functionLoadLst.length] = $fnc;
		return true;
	},
	addOnLoad: function($fnc){
		if(typeof($fnc) != 'function')
			return false;
		this._functionOnLoadLst[this._functionOnLoadLst.length] = $fnc;
		return true;
	},
	run: function(){
		var _this = this;
		var eventToLoad = function(){
			for(var i=0; i<_this._functionOnLoadLst.length; i++)
				_this._functionOnLoadLst[i]();
		};
		addEvent(window,'load', eventToLoad);
		for(var i=0; i<this._functionLoadLst.length; i++)
			this._functionLoadLst[i]();
	}
};
//}

String.prototype.trim = function(){
	return this.replace(/^\s*(.*[^ ])\s*$/, "$1");
};

String.prototype.wordLimiter = function($count){
	var reg = new RegExp('\\s*(?:\\S+\\s*){1,'+$count+'}','gi');
	return this.match(reg)[0].trim();
};;
/**
 * @author	Nicholas Almeida
 * @version	2.1.1
 * @original http://www.javascript-coder.com
*/

var valColorError = "#FEFEDE";
var __buttonSubmit__;
var __newWidth__;
var __buttonSubmitSrc__;
var __cAlert__;
var __lang__;
var __cAlertDiv__;
var __cAlertTxt__;
var __oldFocus__;
var __cAlertShow__ = true;

function frmValidator(frmname, lang){
	this.formobj=document.forms[frmname];
	if(!this.formobj){
		alert('BUG: Não foi possívem acessar o formulário: '+frmname);
		return;
	};
	if(this.formobj.onsubmit){
		this.formobj.old_onsubmit = this.formobj.onsubmit;
		this.formobj.onsubmit=null;
	}else{
		this.formobj.old_onsubmit = null;
	};
	this.formobj.onsubmit=form_submit_handler;
	this.lang = __lang__ = lang;
	this.cAlert = customAlert;
	this.av = add_validation;
	this.cSubmit = change_submit;	
	this.amv = addMultiVal;
	this.customValidation=set_addnl_vfunction;
	this.clearAllValidations = clear_all_validations;
	this.formobj.onreset = rABgColor;
};
function set_addnl_vfunction(functionname){
	this.formobj.addnlvalidation = functionname;
};
function clear_all_validations(){
	for(var itr=0;itr < this.formobj.elements.length;itr++){
		this.formobj.elements[itr].validationset = null;
	};
};
function customAlert(d,t,s){
	if(!gElm(d) || !gElm(t)) {
		alert('BUG: Box id not defined or Text id not defined.');
		return;
	} else {
		__cAlert__ = true;
		__cAlertDiv__ = d;
		__cAlertTxt__ = t;
		__cAlertShow__ = s;		
	}
};
function form_submit_handler(){
	for(var itr=0;itr < this.elements.length;itr++){
		if(this.elements[itr].validationset && !this.elements[itr].validationset.validate()){
			return false;
		};
	};
	if(this.addnlvalidation){
		str =' var ret = '+this.addnlvalidation+'()';
		eval(str);
		if(!ret) return ret;
	};

	if(__buttonSubmit__){
		if (__lang__ == 'en'){
			stButton = 'Sending...'; 
		}else if(__lang__ == 'es'){
			stButton = 'Enviando...'; 
		}else{
			stButton = 'Enviando...'; 
		}

		__buttonSubmit__.title = stButton;
		if(__buttonSubmitSrc__){
			__buttonSubmit__.src = __buttonSubmitSrc__;
		}else{
			__buttonSubmit__.value = stButton;
		}
		__buttonSubmit__.disabled = 'disabled';
		__buttonSubmit__.style.cursor = 'wait';
		if(__newWidth__) {__buttonSubmit__.style.width = __newWidth__};
	}
	return true;
};
function add_validation(itemname,descriptor,errstr){
	if(!this.formobj){
		alert('BUG: Formulário não definido corretamente!');
		return;
	};
	var itemobj = this.formobj[itemname];
	if (!itemobj) alert('BUG: Não foi possível encontrar nehum campo com o name=' + itemname);
	if(itemobj.length && isNaN(itemobj.selectedIndex) ){
		itemobj = itemobj[0];
	};	
	if(!itemobj){
		alert('BUG: Não foi possível encontrar o campo com o nome: '+itemname);
		return;
	};

	if(!itemobj.validationset){
		itemobj.validationset = new ValidationSet(itemobj);
	};
	itemobj.validationset.add(descriptor,errstr);
};
function change_submit(bt,newWidth, buttonSubmitSrc){
	if(!this.formobj){
		alert('BUG: Formulário não definido corretamente!');
		return;
	};
	__buttonSubmit__ = gElm(bt);
	__newWidth__ = newWidth;
	__buttonSubmitSrc__ = buttonSubmitSrc;
};
function ValidationDesc(inputitem,desc,error){
	this.desc=desc;
	this.error=error;
	this.itemobj = inputitem;
	this.validate=vdesc_validate;
};
function vdesc_validate() {
	if(!validateInput(this.desc,this.itemobj,this.error)){
		if(!__cAlert__) this.itemobj.focus();
		return false;
	};
	return true;
};
function ValidationSet(inputitem){
	this.vSet=new Array();
	this.add= add_validationdesc;
	this.validate= vset_validate;
	this.itemobj = inputitem;
};
function add_validationdesc(desc,error){
	this.vSet[this.vSet.length]= 
	new ValidationDesc(this.itemobj,desc,error);
};
function vset_validate(){
	for(var itr=0;itr<this.vSet.length;itr++){
		if(!this.vSet[itr].validate()){
			return false;
		};
	};
	return true;
};
function validateEmail(email){
	if (email.length <= 0) {
		return true;
	};
	var splitted = email.match('^(.+)@(.+)$');
	if (splitted == null)return false;
	if (splitted[1] != null ) {
		var regexp_user = /^\"?[\w-_\.]*\"?$/;
		if (splitted[1].match(regexp_user) == null)return false;
	};
	if (splitted[2] != null) {
		var regexp_domain = /^[\w-\.]*\.[A-Za-z]{2,4}$/;
		if (splitted[2].match(regexp_domain) == null) {
			var regexp_ip = /^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
			if (splitted[2].match(regexp_ip) == null)return false;
		};
		return true;
	};
	return false;
};

function TestComparison(objValue,strCompareElement,strvalidator,strError){
	var bRet=true;
	var objCompare=null;
	if(!objValue.form){
		alert('BUG: Formulário não definido!');
		return false
	};
	objCompare = objValue.form.elements[strCompareElement];
	if(!objCompare){
		alert('BUG: Campo com o nome '+strCompareElement+' não encontrado!');
		return false;
	};
	var cmpstr='';
	switch(strvalidator){
		case 'equal': 
		case 'eq': {
			if(objValue.value != objCompare.value){
				if (__lang__ == 'en'){
					cmpstr = ' must be the same as field \"';
				}else if(__lang__ == 'es'){
					cmpstr = ' debe ser igual al campo \"';
				}else{
					cmpstr = ' deve ser igual ao campo \"';
				}
				bRet = false;
			};
			break;
		};
		case 'notequal':
		case 'noteq': {
			if(objValue.value.length > 0 && objCompare.value.length > 0 && objValue.value == objCompare.value){
				if (__lang__ == 'en'){
					cmpstr = ' must be different from field \"';
				}else if(__lang__ == 'es'){
					cmpstr = ' debe ser diferente del campo \"';
				}else{
					cmpstr = ' deve ser diferente do campo \"';
				}
				bRet = false;
			};
			break;			
		};			
	};
	if(bRet==false){
		if(!strError || strError.length==0){
			if (__lang__ == 'en'){
				strError = 'Field \"' + objValue.title + '\"' + cmpstr + objCompare.title + '\".'; 
			}else if(__lang__ == 'es'){
				strError = 'El campo \"' + objValue.title + '\"' + cmpstr + objCompare.title + '\".'; 
			}else{
				strError = 'O campo \"' + objValue.title + '\"' + cmpstr + objCompare.title + '\".'; 
			}
			cBgColor(objValue);
		};
		boxAlert(strError, objValue);
	};
	if(bRet) rBgColor(objValue);
	return bRet;
};

function TestSelMin(objValue,strMinSel,strError){
	var bret = true;
	var objcheck = objValue.form.elements[objValue.name];
	var chkcount =0;
	if(objcheck.length){
		for(var c=0;c < objcheck.length;c++){
			if(objcheck[c].checked == '1'){
				chkcount++;
			};
		};
	}else {
		chkcount = (objcheck.checked == '1')?1:0;
	};
	var minsel = eval(strMinSel);
	if(chkcount < minsel) {
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = 'Select at least ' + minsel + ' option(s) for field \"' + objValue.title + '\".';
			}else if(__lang__ == 'es'){
				strError = 'Seleccione al menos ' + minsel + ' opciones para el campo \"' + objValue.title + '\".';
			}else{
				strError = 'Selecione ao menos ' + minsel + ' opção(ões) para o campo \"' + objValue.title + '\".';
			}
		};
		boxAlert(strError, objValue); 
		bret = false;
	};
	if(bret) rBgColor(objValue);
	return bret;
};

function TestSelMax(objValue,strMaxSel,strError){
	var gret = true;
	var objcheck = objValue.form.elements[objValue.name];
	var chkcount =0;
	if(objcheck.length){
		for(var c=0;c < objcheck.length;c++){
			if(objcheck[c].checked == '1'){
				chkcount++;
			};
		};
	}else {
		chkcount = (objcheck.checked == '1')?1:0;
	};
	var maxsel = eval(strMaxSel);
	if(chkcount > maxsel) {
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = 'Select at the most ' + maxsel + ' option(s) for field \"' + objValue.title + '\".';
			}else if(__lang__ == 'es'){
				strError = 'Seleccione como máximo ' + maxsel + ' opciones para el campo \"' + objValue.title + '\".';
			}else{
				strError = 'Selecione no máximo ' + maxsel + ' opção(ões) para o campo \"' + objValue.title + '\".';
			}
		};
		boxAlert(strError, objValue); 
		gret = false;
	};
	if(gret) rBgColor(objValue);
	return gret;
};

function TestDontSelect(objValue,index,strError){
	var ret = true;
	if(objValue.selectedIndex == null) { 
		alert('BUG: Este comando só pode ser usado para elementos de seleção.'); 
		ret = false; 
	}else if(objValue.selectedIndex == eval(index)) { 
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = 'Select one of the options for field \"' + objValue.title + '\".'; 
			}else if(__lang__ == 'es'){
				strError = 'Seleccione una de las opciones para el campo \"' + objValue.title + '\".'; 
			}else{
				strError = 'Selecione uma das opções para o campo \"' + objValue.title + '\".'; 
			}
		};                                                        
		boxAlert(strError, objValue); 
		ret =  false;
		cBgColor(objValue);                            
	}; 
	if(ret) rBgColor(objValue);
	return ret;
};

function TestRequiredInput(objValue,strError){
	var ret = true;
	if(eval(objValue.value.length) == 0) { 
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = 'Field \"' + objValue.title + '\" must be filled out.'; 
			}else if(__lang__ == 'es'){
				strError = 'El campo \"' + objValue.title + '\" es obligatorio.'; 
			}else{
				strError = 'O campo \"' + objValue.title + '\" é obrigatório.'; 			
			}
		};
		boxAlert(strError, objValue);
		ret=false; 
		cBgColor(objValue);
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestMaxLen(objValue,strMaxLen,strError){
	var ret = true;
	if(eval(objValue.value.length) > eval(strMaxLen)) { 
		if(!strError || strError.length ==0) {
			if (__lang__ == 'en'){
				strError = 'Field \"' + objValue.title + '\" can contain up to '+ strMaxLen +' character(s).'; 
				strErrorCont = 'Currently it has: ' + objValue.value.length + ' character(s).';
			}else if(__lang__ == 'es'){
				strError = 'El campo \"' + objValue.title + '\" puede contener hasta '+ strMaxLen +' caracter(es).'; 
				strErrorCont = 'Actualmente tiene: ' + objValue.value.length + ' carácter(es).';
			}else{
				strError = 'O campo \"' + objValue.title + '\" pode conter no máximo '+ strMaxLen +' caracter(es).'; 
				strErrorCont = 'Atualmente ele tem: ' + objValue.value.length + ' caracter(es).';
			}
		};
		cBgColor(objValue);
		boxAlert(strError + '\n' + strErrorCont, objValue); 
		ret = false; 
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestMinLen(objValue,strMinLen,strError){
	var ret = true;
	if(eval(objValue.value.length) <  eval(strMinLen)) { 
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = 'Field \"' + objValue.title + '\" must contain at least '+ strMinLen +' character(s).'; 
				strErrorCont = 'Currently it has: ' + objValue.value.length + ' character(s).';
			}else if(__lang__ == 'es'){
				strError = 'El campo \"' + objValue.title + '\" debe contener un mínimo de '+ strMinLen +' caracter(es).'; 
				strErrorCont = 'Actualmente tiene: ' + objValue.value.length + ' carácter(es).';
			}else{
				strError = 'O campo \"' + objValue.title + '\" deve conter no mínimo ' + strMinLen + ' caracter(es).'; 
				strErrorCont = 'Atualmente ele tem: ' + objValue.value.length + ' caracter(es).';
			}
		};
		cBgColor(objValue);
		boxAlert(strError + '\n' + strErrorCont, objValue); 
		ret = false;   
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestInputType(objValue,strRegExp,strError,strDefaultError){
	var ret = true;
	var charpos = objValue.value.search(strRegExp); 
	if(objValue.value.length > 0 &&  charpos >= 0) { 
		if(!strError || strError.length ==0) { 
			strError = strDefaultError;
			if (__lang__ == 'en'){
				strErrorCont = 'Error of character in position: ';
			}else if(__lang__ == 'es'){
				strErrorCont = 'Error en el carácter en la posición: ';
			}else{
				strErrorCont = 'Erro no caracter na posição: ';
			}
		};
		cBgColor(objValue);
		boxAlert(strError + '\n' + strErrorCont + eval(charpos+1)+'.', objValue); 
		ret = false; 
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestEmail(objValue,strError){
	var ret = true;
	if(objValue.value.length > 0 && !validateEmail(objValue.value)	 ) { 
		if(!strError || strError.length ==0) { 
			if (__lang__ == 'en'){
				strError = '\"' + objValue.value+'\" is not a valid e-mail for field \"' + objValue.title + '\".'; 
			}else if(__lang__ == 'es'){
				strError = '\"' + objValue.value+'\" no es un e-mail válido para el campo \"' + objValue.title + '\".'; 
			}else{
				strError = '\"' + objValue.value+'\" não é um e-mail válido para o campo \"' + objValue.title + '\".'; 
			}
		};
		boxAlert(strError, objValue); 
		ret = false; 
		cBgColor(objValue);
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestRegExp(objValue,strRegExp,strError){
	var ret = true;
	if( objValue.value.length > 0 && !objValue.value.match(strRegExp) ) { 
		if(!strError || strError.length ==0) {
			if (__lang__ == 'en'){
				strError = 'Invalid character found in field \"' + objValue.title + '\".';
			}else if(__lang__ == 'es'){
				strError = 'Carácter no permitido encontrado en el campo \"' + objValue.title + '\".';
			}else{
				strError = 'Caracter não permitido encontrado no campo \"' + objValue.title + '\".';
			}
		};
		boxAlert(strError, objValue); 
		ret = false;
		cBgColor(objValue);
	};
	if(ret) rBgColor(objValue);
	return ret;
};

function TestSelectOneRadio(objValue,strError){
	var objradio = objValue.form.elements[objValue.name];
	if (!objradio) alert('BUG: Não foi possível encotrar nenhum radioButton no formulário.\nCertifique-se de que eles existem e que tem o atributo \"name\".');
	var one_selected=false;
	for(var r=0;r < objradio.length;r++){
		if(objradio[r].checked == '1'){
			one_selected=true;
			break;
		};
	};
	if(false == one_selected){
		if(!strError || strError.length ==0) {
			if (__lang__ == 'en'){
				strError = 'Select one of the options for field  \"'+objValue.title+'\".'; 
			}else if(__lang__ == 'es'){
				strError = 'Seleccione una de las opciones para el campo \"'+objValue.title+'\".'; 
			}else{
				strError = 'Selecione uma das opções para o campo \"'+objValue.title+'\".'; 
			}
		};	
		boxAlert(strError, objValue);
	};
	return one_selected;
};

function TestCpf(v) {
	if (v == "00000000000" || v == "11111111111" || v == "22222222222" || v == "33333333333" || v == "44444444444" || v == "55555555555" || v == "66666666666" || v == "77777777777" || v == "88888888888" || v == "99999999999") return false;
	if(!v) return true;
	var s=null;
	var r=null;
	if(v.length!=11||v.match(/1{11};|2{11};|3{11};|4{11};|5{11};|6{11};|7{11};|8{11};|9{11};|0{11};/)) return false;
	s=0;
	for(var i=0;i<9;i++) s+=parseInt(v.charAt(i))*(10-i);
	r=11-(s%11);
	if(r==10||r==11) r=0;
	if(r!=parseInt(v.charAt(9))) return false;
	s=0;
	for(var i=0;i<10;i++) s+=parseInt(v.charAt(i))*(11-i);
	r=11-(s%11);
	if(r==10||r==11) r=0;
	if(r!=parseInt(v.charAt(10))) return false;
	return true;
};

function TestCnpj(v) {
	if(!v) return true;
	var m = new Array('543298765432','6543298765432');
	var d = new Array(0,0);
	for (var t=0; t<2; t++) {
		for(x=0; x<13; x++) {
			if ((t==0 && x!=12) || t==1) d[t] += ( parseInt(v.slice(x,x+1)) * parseInt(m[t].slice(x,x+1)) );
		};
		d[t] = (d[t] * 10) % 11;
		if (d[t] == 10) d[t] = 0;
	};
	return (d[0] == parseInt(v.slice(12,13)) && d[1] == parseInt(v.slice(13,14)));
};

function TestFile(v ,ext) {
	if(!v) return true;
	var e = ext.split(",");
	for(var i=0; i<e.length; i++) {
		if (v.substr(v.lastIndexOf('.')+1)==e[i]) return true;
	};
	return false;
};

function replaceAll(str, replacements ) {
	for ( i = 0; i < replacements.length; i++ ) {
		var idx = str.indexOf( replacements[i][0] );
		while ( idx > -1 ) {
			str = str.replace( replacements[i][0], replacements[i][1] );
			idx = str.indexOf( replacements[i][0] );
		};
	};
	return str;
};
function addMultiVal(){
	var arrPar = [];
	for(var i=0; i<arguments.length; i++){
		arrPar[i] = arguments[i];
	};
	var fld = arrPar[0];
	arrPar = arrPar.slice(1,arrPar.length);
	for (var a=0;a<arrPar.length;a++){
		this.av(fld,arrPar[a]);
	};
	delete arrPar, fld;
};
function validateInput(strValidateStr,objValue,strError) {
	var ret = true;
	var epos = strValidateStr.search('='); 
	var command  = ''; 
	var cmdvalue = ''; 
	if(epos >= 0) { 
		command  = strValidateStr.substring(0,epos); 
		cmdvalue = strValidateStr.substr(epos+1); 
	}else { 
		command = strValidateStr; 
	}; 
	switch(command) { 
		case 'req': 
		case 'required': { 
			ret = TestRequiredInput(objValue,strError);
			break;             
		};
		case 'maxlength': 
		case 'maxlen': { 
			ret = TestMaxLen(objValue,cmdvalue,strError);
			break; 
		};
		case 'minlength': 
		case 'minlen': { 
			ret = TestMinLen(objValue,cmdvalue,strError);
			break; 
		};
		case 'alnum': 
		case 'alphanumeric': { 
			if (__lang__ == 'en'){
				strTxtError = 'Only alphanumeric characters (letters and numbers) are valid for field'; 
			}else if(__lang__ == 'es'){
				strTxtError = 'Sólo caracteres alfanuméricos (letras y números) son permitidos para el campo'; 
			}else{
				strTxtError = 'Apenas caracteres alfanuméricos(letras e números) são permitidos para o campo';
			}
		
			ret = TestInputType(objValue,'[^A-Za-z0-9áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ\\s]',strError, strTxtError + ' \"' + objValue.title + '\".');
			break;
		};
		case 'num': 
		case 'number': 
		case 'numeric': {
			if (__lang__ == 'en'){
				strTxtError = 'Only numeric characters (numbers) are valid for field'; 
			}else if(__lang__ == 'es'){
				strTxtError = 'Sólo caracteres numéricos (números) son permitidos para el campo'; 
			}else{
				strTxtError = 'Apenas caracteres numéricos(números) são permitidos para o campo';
			}
		 
			ret = TestInputType(objValue,'[^0-9]',strError,  strTxtError + ' \"' + objValue.title + '\".');
			break;
		};
		case 'letters': 
		case 'let': { 
			if (__lang__ == 'en'){
				strTxtError = 'Only letters are valid for field'; 
			}else if(__lang__ == 'es'){
				strTxtError = 'Sólo letras son permitidas para el campo'; 
			}else{
				strTxtError = 'Apenas letras são permitidas para o campo';
			}
		
			ret = TestInputType(objValue,'[^A-Za-záàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ\\s]',strError, strTxtError + ' \"' + objValue.title + '\".');
			break; 
		};
		case 'restrict':
		case 'rest': { 
			if (__lang__ == 'en'){
				strTxtError = 'Only letters, numbers, \"-\" and \"_\" are valid for field'; 
			}else if(__lang__ == 'es'){
				strTxtError = 'Sólo letras, números, \"-\" y \"_\" son permitidos para el campo'; 
			}else{
				strTxtError = 'Apenas letras, números, \"-\" e \"_\"  são permitidas para o campo';
			}
			ret = TestInputType(objValue,'[^A-Za-z0-9-_]',strError, strTxtError + ' \"' + objValue.title + '\".');
			break; 
		};
		case 'email': { 
			ret = TestEmail(objValue,strError);
			break; 
		};
		case "lt":
		case "lessthan":{
		    if (isNaN(objValue.value)) {
				if (__lang__ == 'en'){
					strTxtError = 'Only numeric characters (numbers) are valid for field'; 
				}else if(__lang__ == 'es'){
					strTxtError = 'Sólo caracteres numéricos (números) son permitidos para el campo'; 
				}else{
					strTxtError = 'Apenas caracteres numéricos(números) são permitidos para o campo';
				}
					
		        boxAlert(strTxtError + ' \"' + objValue.title + '\".', objValue);
				cBgColor(objValue);
		        return false;
		    };
		    if (eval(objValue.value) > eval(cmdvalue)) {
		        if (!strError || strError.length == 0) {
					if (__lang__ == 'en'){
			            strError = 'Field \"' + objValue.title + '\" must be smaller or equal than: ' + cmdvalue + '.';
					}else if(__lang__ == 'es'){
			            strError = 'El campo \"' + objValue.title + '\" debe ser menor o igual a: ' + cmdvalue + '.';
					}else{
			            strError = 'O campo \"' + objValue.title + '\" deve ser menor ou igual a: ' + cmdvalue + '.';
					}
		        };
		        boxAlert(strError, objValue);
				cBgColor(objValue);
		        return false;
		    };
		    break;
		};
		case "gt":
		case "greaterthan":{
		    if (isNaN(objValue.value)) {
				if (__lang__ == 'en'){
					strTxtError = 'Only numeric characters (numbers) are valid for field'; 
				}else if(__lang__ == 'es'){
					strTxtError = 'Sólo caracteres numéricos (números) son permitidos para el campo'; 
				}else{
					strTxtError = 'Apenas caracteres numéricos(números) são permitidos para o campo';
				}
		        boxAlert(strTxtError + ' \"' + objValue.title + '\".', objValue);
				cBgColor(objValue);
		        return false;
		    };
		    if (eval(objValue.value) < eval(cmdvalue)) {
		        if (!strError || strError.length == 0) {
					if (__lang__ == 'en'){
			            strError = 'Field \"' + objValue.title + '\" must be bigger or equal than: ' + cmdvalue + '.';
					}else if(__lang__ == 'es'){
			            strError = 'El campo \"' + objValue.title + '\" debe ser mayor o igual a: ' + cmdvalue + '.';
					}else{
			            strError = 'O campo \"' + objValue.title + '\" deve ser maior ou igual a: ' + cmdvalue + '.';
					}
		        };
		        boxAlert(strError, objValue);
				cBgColor(objValue);
		        return false;
		    };
		    break;
		};
		case 'regex': { 
			ret = TestRegExp(objValue,cmdvalue,strError);
			break; 
		};
		case 'dontselect': { 
			ret = TestDontSelect(objValue,cmdvalue,strError);
			break; 
		};
		case 'selmin':{
			ret = TestSelMin(objValue,cmdvalue,strError);
			break;
		};
		case 'selmax':{
			ret = TestSelMax(objValue,cmdvalue,strError);
			break;
		};
		case 'selone':{
			ret = TestSelectOneRadio(objValue,strError);
			break;
		};		 
		case 'equal': 
		case 'eq': 
		case 'notequal':
		case 'noteq':{
			return TestComparison(objValue,cmdvalue,command,strError);
			break;
		};
		case 'cpf': { 
			var tmpValue = replaceAll(objValue.value, [['.', ''],[ '/', '' ],['-', ''],[' ', '']]);
			ret = TestCpf(tmpValue);
			if(!ret) {
					if (__lang__ == 'en'){
			            strErrorTxt = 'is not a valid CPF number for field';
					}else if(__lang__ == 'es'){
			            strErrorTxt = 'no es un número de CPF válido para el campo';
					}else{
			            strErrorTxt = 'não é um número de CPF válido para o campo';
					}
						
				boxAlert('\"' + objValue.value + '\" ' + strErrorTxt + ' \"' + objValue.title + '\".', objValue);
				cBgColor(objValue);
			}
			else rBgColor(objValue);
			delete tmpValue;
			break;             
		};
		case 'cnpj': { 
			var tmpValue = replaceAll(objValue.value, [['.', ''],[ '/', '' ],['-', ''],[' ', '']]);
			ret = TestCnpj(tmpValue);
			if(!ret) {
				if (__lang__ == 'en'){
		            strErrorTxt = 'is not a valid CNPJ number for field';
				}else if(__lang__ == 'es'){
		            strErrorTxt = 'no es un número de CNPJ válido para el campo';
				}else{
		            strErrorTxt = 'não é um número de CNPJ válido para o campo';
				}
						
				boxAlert('\"' + objValue.value + '\" ' + strErrorTxt + ' \"' + objValue.title + '\".', objValue);
				cBgColor(objValue);
			}
			else rBgColor(objValue);
			delete tmpValue;
			break;             
		};
		case 'file': { 
			ret = TestFile(objValue.value.toLowerCase(), cmdvalue);
			if(!ret) {
				if (__lang__ == 'en'){
					boxAlert('Field \"' + objValue.title + '\" allows only \".' + cmdvalue +' \"archives.', objValue);
				}else if(__lang__ == 'es'){
					boxAlert('El campo \"' + objValue.title + '\" permite sólo archivos con la extensión \".' + cmdvalue +' \".', objValue);
				}else{
					boxAlert('O campo \"' + objValue.title + '\" permite somente arquivos com a extensão \".' + cmdvalue +' \".', objValue);
				}
				cBgColor(objValue);
			}
			else rBgColor(objValue);
			delete tmpValue;
			break;             
		};
	};
	if(ret) rBgColor(objValue);
	return ret; 
};

function cBgColor(o){o.style.backgroundColor = valColorError;};

function rBgColor(o){o.style.backgroundColor = "";};

function rABgColor(){
	for (var itr = 0; itr < this.elements.length; itr++) {
		rBgColor(this.elements[itr]);
	};
};

function only(t,o,e) {
	if(window.event)key=window.event.keyCode;
	else if(e)key=e.which;
	else return true;
	S=(o)?o:'';
	if(t=='num'||t=='number'||t=='numeric')S+='0123456789';
	if(t=='alnum'||t=='alphanumeric')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ 0123456789';
	if(t=='let'||t=='letters')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZáàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÔÖÚÙÛÜÇ ';	
	if(t=='rest'||t=='restrict')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	if(t=='email')S+='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@-_.';
	if(key==null||key==0||key==8||key==9||key==13||key==27)return true;
	else if(S.indexOf(String.fromCharCode(key))!=-1)return true;
	else return false;
};

function not(S,e) {
	if(window.event)key=window.event.keyCode;
	else if(e)key=e.which;
	else return true;
	if(!S)return false;
	else if(key==null||key==0||key==8||key==9||key==13||key==27)return true;
	else if(S.indexOf(String.fromCharCode(key))!=-1)return false;
	else return true;
};


function jump(o,e) {
	if(window.event)key=window.event.keyCode;
	else if(e)key=e.which;
	else return;
	if (key==9||key==2||key==16) return;
	if(o.value.length==o.maxLength){
  		for(var i=0;i<o.form.length;i++){
	    	if(o.form[i]==o&&o.form[i+1]){
				if(o.form[i+1]) o.form[i+1].focus();
	    		break;
	    	};
		}
	};
};

function checkReset(f){
	if (__lang__ == 'en'){
		strErrorTxt = 'All data submitted will be deleted.\nTo delete all data click \"OK\".\nTo continue submitting information click \"Cancel\".';
	}else if(__lang__ == 'es'){
		strErrorTxt = 'Todos los datos registrados serán borrados.\nPara borrar todos los datos haga clic en \"OK\".\nPara continuar registrando haga clic en \"Cancelar\".';
	}else{
		strErrorTxt = 'Todos os dados preenchidos serão apagados.\nPara apagar todos os dados clique em \"OK\".\nPara continuar preenchendo clique em \"Cancelar\".';
	}
	if(confirm(strErrorTxt)) gElm(f).reset();
};

function clearMe(w,s){
	(w.value == s) ? w.value='' : 0;
};

function leaveMe(w,s){
	(w.value.length == 0) ? w.value = s : 0;
};

function boxAlert(x, f){
	if(__cAlert__) {
		if(__cAlertShow__){
			openBox(__cAlertDiv__);
		}  else {
			sDiv(__cAlertDiv__);
			f.focus();
		}
		gElm(__cAlertTxt__).innerHTML = x;
		__oldFocus__ = f;

	} else {
		alert(x); 
	}
};

function oldFocus(){
	__oldFocus__.focus();
};;
if(!window['cct'])
	var cct = {};

/*
	PACKAGE 'EVENTS'
*/
if(!cct['events'])
	cct.events = {};
	
cct.events.ListenerManager = function(){
	
	var _this = this;
	var _events = [];
	/*
		{
			scope: scope,
			type1: [methods],
			type2: [methods], ...
		}
	*/
	
	var _hasScope = function(scope){
		for (var i=0; i < _events.length; i++)
			if(_events[i])
				if(_events[i].scope == scope)
					return true;
		return false;
	};
	var _hasType = function(scope, type){
		if(!_hasScope(scope))
			return false;
		if(_getByScope(scope)[type] == null)
			return false;
		return true;
	};
	
	
	var _getByScope = function(scope){
		for (var i=0; i < _events.length; i++)
			if(_events[i])
				if(_events[i].scope == scope)
					return _events[i];
	};
	
	
	var _setScope = function(scope){
		if(!_hasScope(scope))
			_events[_events.length] = {scope:scope};
	};
	var _setType = function(scope, type){
		_setScope(scope);
		var scopeOnEvent = _getByScope(scope);
		if(scopeOnEvent[type] == null){
			scopeOnEvent[type] = [];
		}
	};
	
	
	this.hasEventListener = function(scope, type, method){
		if(!_hasType(scope, type))
			return false;
		var typeOnEvent = _getByScope(scope)[type];
		for (var i=0; i < typeOnEvent.length; i++)
			if(typeOnEvent[i] == method)
				return true;
		return false;
	};
	this.addEventListener = function(scope, type, method){
		
		// validation
		if(!scope)
			throw new Error(this+'.addEventListener: scope ('+scope+') is not defined.');

		if(!type)
			throw new Error(this+'.addEventListener: type ('+type+') is not defined.');

		if(typeof(method) != 'function')
			throw new Error(this+'.addEventListener: method ('+method+') must be a function.');
			
		_setType(scope, type);
		if(!_this.hasEventListener(scope, type, method)){
			var scopeOnEvent = _getByScope(scope);
			scopeOnEvent[type][scopeOnEvent[type].length] = method;
		}
	};
	this.removeEventListener = function(scope, type, method){
		/*
			TODO: REMOVE LISTENER
		*/
	};
	
	this.dispatchEvent = function(scope, type, extra){
		if(!scope || !type) return;
		
		if(!_hasType(scope, type))
			return;
		
		var typeOnEvent = _getByScope(scope)[type];
		for (var i=0; i < typeOnEvent.length; i++)
			if(typeof(typeOnEvent[i]) == 'function')
				typeOnEvent[i]({target: scope, type: type, extra: extra});
	};
	// this.removeAllEventListeners
	// 	this.removeAllEventListenersByGroup
	
};
cct.events.ListenerManager._instance = null;
cct.events.ListenerManager.getInstance = function(){
	if(this._instance == null)
		this._instance = new cct.events.ListenerManager();
	return this._instance;
};
cct.events.ListenerManager.prototype.toString = function(){
	return '[cct.events.ListenerManager]';
};
cct.events.defaultEvents = {
	ON_LOAD: 'onLoad',
	ON_COMPLETE: 'onComplete',
	ON_CLOSE: 'onClose',
	ON_OPEN: 'onOpen',
	ON_ERROR: 'onError'
};

/*
	PACKAGE 'IMAGEs'
*/

if(!cct['images'])
	cct.images = {};
	
cct.images.ImageLoader = function(URL){
	
	// classes alias
	var Log = cct.utils.Log;
	
	// validation
	if(!URL){
		throw new Error(this+' URL ('+URL+') is not defined.');
		return;
	}

	// declare
	var _this = this;
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _img = document.createElement('img');
	
	//private methods
	var _onLoad = function(){
		Log.info(this+' success loading image "'+URL+'"');
		_listenerManager.dispatchEvent(_this, cct.events.defaultEvents.ON_LOAD, {
			image: _img
		});
	};
	var _onError = function(){
		Log.error(this+' error loading image "'+URL+'"');
		_listenerManager.dispatchEvent(_this, cct.events.defaultEvents.ON_ERROR, {
			image: _img
		});
	};
	
	//public methods
	this.load = function(newURL){
		Log.info(this+' loading image "'+URL+'"');
		_img.onload = _onLoad;
		_img.onerror = _onError;
		_img.src = newURL || URL;
	};
};
cct.images.ImageLoader.prototype.toString = function(){
	return '[cct.image.ImageLoader]';
};

/*
	PACKAGE 'UTIL'
*/

if(!cct['utils'])
	cct.utils = {};

/**
 * TypeVerifier (Static)
 */
cct.utils.TypeVerifier = {
	isInt: function(value){
		if(typeof(value) == 'number')
			if(value%1 == 0)
				return true;
		return false;
	},
	isArray: function(value){
		if(value)
			if(value.length != null)
				return true;
		return false;
	},
	isNode: function(value){
		if(value)
			if(value.nodeName)
				return true;
		return false;
	}
};

/**
 * Log (Static)
 */
cct.utils.Log = {
	logLevel: 0,
	logFunction: null,
	getFunction: function(){
		if(!cct.utils.Log.logFunction){
			if(window['console']){
				if(console.info){
					cct.utils.Log.logFunction = console.info;
				}
			}else{
				cct.utils.Log.logFunction = alert;
			}
		}
		return cct.utils.Log.logFunction;
	},
	info: function(value){
		var logFunction = cct.utils.Log.getFunction();
		if(cct.utils.Log.logLevel > 2)
			logFunction("INFO: "+value);
	},
	warning: function(value){
		var logFunction = cct.utils.Log.getFunction();
		if(cct.utils.Log.logLevel > 1)
			logFunction("WARNING: "+value);
	},
	error: function(value){
		var logFunction = cct.utils.Log.getFunction();
		if(cct.utils.Log.logLevel > 0)
			logFunction("******\nERROR: "+value+"\n******");
	}
};
 
/**
 * CarretManager. Useful class to work with carrets (ex.: photo galleries with next previous controls)
 * @param {int} totalPosition Total number of items 
 * @return {int} initPosition first selected item
 */
cct.utils.CarretManager = function(totalPosition, initPosition){
	
	
	// classes alias
	var TypeVerifier = cct.utils.TypeVerifier;

	// type validation
	initPosition = initPosition || 0;
	if(!TypeVerifier.isInt(totalPosition) || !TypeVerifier.isInt(initPosition)){
		throw new Error(this+' "totalPosition" ('+totalPosition+') and "initPosition" ('+initPosition+') MUST be int.');
		return;
	}
	if(totalPosition == 0){
		throw new Error(this+' "totalPosition" ('+totalPosition+') MUST be higher than 0 (zero).');
		return;
	}
	
	// declare
	var _this = this;
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _total = totalPosition-1;
	var _initPosition = initPosition || 0;
	var _index = -1;
	
	// getters
	this.getTotal = function(){
		return _total;
	};
	this.getInitPosition = function(){
		return _initPosition;
	};
	this.getIndex = function(){
		return _index;
	};
	this.setLooseIndex = function(index){
		if(index >= 0 && index <= _total){
			_index = index;
		}
	};
	
	// private methods
	var _setNextIndex = function(nextIndex){
		if(nextIndex <= 0){
			_index = 0;
			_listenerManager.dispatchEvent(_this, cct.utils.CarretManager.EVENT_FIRST_ITEM, {
				index: _index,
				total: _total
			});
		}else if(nextIndex >= _total){
			_index = _total;
			_listenerManager.dispatchEvent(_this, cct.utils.CarretManager.EVENT_LAST_ITEM, {
				index: _index,
				total: _total
			});
		}else{
			_index = nextIndex;
			_listenerManager.dispatchEvent(_this, cct.utils.CarretManager.EVENT_MIDDLE_ITEM, {
				index: _index,
				total: _total
			});
		}
		_listenerManager.dispatchEvent(_this, cct.utils.CarretManager.EVENT_ANY_ITEM, {
			index: _index,
			total: _total
		});
	};
	
	// public methods
	this.next = function(){
		_setNextIndex(_index + 1);
	};
	this.previous = function(){
		_setNextIndex(_index - 1);
	};
	this.go = function(nextIndex){
		_setNextIndex(nextIndex);
	};
	
	// contruct
	this.init = function(){
		_setNextIndex(_initPosition);
	};
	
};
cct.utils.CarretManager.EVENT_FIRST_ITEM = 'eventFirstItem';
cct.utils.CarretManager.EVENT_LAST_ITEM = 'eventLastItem';
cct.utils.CarretManager.EVENT_MIDDLE_ITEM = 'eventMiddleItem';
cct.utils.CarretManager.EVENT_ANY_ITEM = 'eventAnyItem';
cct.utils.CarretManager.prototype.toString = function(){
	return '[cct.utils.CarretManager]';
};

/**
 * Parses CSV string and return an array of objects
 */
cct.utils.parseCSV = function(value){
	var csvBase = value.replace(/\n$/g, "").split('\n');
	
	if(csvBase.length <= 1) return null;
	
	var csvLabels = csvBase[0].split(',');
	var csvValues = csvBase.slice(1);
	
	var returnObject = [];

	var currentValues = [];
	var valuesLength = csvValues.length;
	var labelsLength = csvLabels.length;
	for(var i=0;i<valuesLength; i++){
		currentValues = csvValues[i].split(',');
		for(var j=0;j<labelsLength;j++){
			if(returnObject[i] == null)
			 	returnObject[i] = {};
			returnObject[i][csvLabels[j]] = currentValues[j] || '';
		}
	}
	return returnObject;
};

/**
 * CPF / CNPJ masks
 */
cct.utils.mask = function(type, field, e) {
	var tecla = window.event ? e.keyCode : e.which;
	var s = field.value;
	s = s.replace(/(\.|\(|\)|\/|\-| )+/g,'');

	tam = s.length + 1;

	if ( tecla != 9 && tecla != 8 ) {
		switch (type){
			case 'CPF' :
				if (tam > 3 && tam < 7)
					field.value = s.substr(0,3) + '.' + s.substr(3, tam);
				if (tam >= 7 && tam < 10)
					field.value = s.substr(0,3) + '.' + s.substr(3,3) + '.' + s.substr(6,tam-6);
				if (tam >= 10 && tam < 12)
					field.value = s.substr(0,3) + '.' + s.substr(3,3) + '.' + s.substr(6,3) + '-' + s.substr(9,tam-9);
			break;

			case 'CNPJ' :

				if (tam > 2 && tam < 6)
					field.value = s.substr(0,2) + '.' + s.substr(2, tam);
				if (tam >= 6 && tam < 9)
					field.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,tam-5);
				if (tam >= 9 && tam < 13)
					field.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,3) + '/' + s.substr(8,tam-8);
				if (tam >= 13 && tam < 15)
					field.value = s.substr(0,2) + '.' + s.substr(2,3) + '.' + s.substr(5,3) + '/' + s.substr(8,4)+ '-' + s.substr(12,tam-12);
			break;
		}
	}
}

/*
	PACKAGE 'SITE'
*/

if(!cct['site'])
	cct.site = {};

/**
 * PhotoManager
 * @param {array} photoArray (array of urls)
 */
cct.site.PhotoCarret = function(photoArray){
	
	// classes alias
	var TypeVerifier = cct.utils.TypeVerifier;
	var CarretManager = cct.utils.CarretManager;
	
	// type validation
	if(!TypeVerifier.isArray(photoArray)){
		throw new Error('[cct.site.PhotoManager] photoArray ('+photoArray+') MUST be an Array.');
		return;
	}
	
	// declare
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _this = this;
	var _photoArray = photoArray;
	var _carretManager = new CarretManager(_photoArray.length, 0);
	
	// getters
	this.getCarret = function(){
		return _carretManager;
	};
	this.getPhotoByIndex = function(index){
		return _photoArray[index];
	};
	
	// private methods
	
	// public methods
	this.go = function(index){
		_carretManager.go(index);
	};
	this.previous = function(){
		_carretManager.previous();
	};
	this.next = function(){
		_carretManager.next();
	};
	
	// contruct
	this.init = function(){
		_listenerManager.addEventListener(_carretManager, CarretManager.EVENT_ANY_ITEM, function(e){
			_listenerManager.dispatchEvent(_this, CarretManager.EVENT_ANY_ITEM, {
				index: e.extra.index,
				total: e.extra.total,
				photo: _photoArray[_carretManager.getIndex()]
			});
		});
		_listenerManager.addEventListener(_carretManager, CarretManager.EVENT_MIDDLE_ITEM, function(e){
			_listenerManager.dispatchEvent(_this, CarretManager.EVENT_MIDDLE_ITEM, {
				index: e.extra.index,
				total: e.extra.total,
				photo: _photoArray[_carretManager.getIndex()]
			});
		});
		_listenerManager.addEventListener(_carretManager, CarretManager.EVENT_FIRST_ITEM, function(e){
			_listenerManager.dispatchEvent(_this, CarretManager.EVENT_FIRST_ITEM, {
				index: e.extra.index,
				total: e.extra.total,
				photo: _photoArray[_carretManager.getIndex()]
			});
		});
		_listenerManager.addEventListener(_carretManager, CarretManager.EVENT_LAST_ITEM, function(e){
			_listenerManager.dispatchEvent(_this, CarretManager.EVENT_LAST_ITEM, {
				index: e.extra.index,
				total: e.extra.total,
				photo: _photoArray[_carretManager.getIndex()]
			});
		});
		_carretManager.init();
	};
	
};
cct.site.PhotoCarret.prototype.toString = function(){
	return '[cct.site.PhotoCarret]';
};

/**
 * PhotoGallery.
 * @needs main.js v10+
 */
cct.site.PhotoGallery = function(photoArray, thumbNodeArray, bigPhotoNode){
	
	// classes alias
	var TypeVerifier = cct.utils.TypeVerifier;
	var PhotoCarret = cct.site.PhotoCarret;
	var CarretManager = cct.utils.CarretManager;
	var ImageLoader = cct.images.ImageLoader;
	var Log = cct.utils.Log;
	var defaultEvents = cct.events.defaultEvents;

	// validation
	if(!TypeVerifier.isArray(photoArray) || !TypeVerifier.isArray(thumbNodeArray)){
		throw new Error(this+' photoArray ('+photoArray+') and thumbNodeArray ('+thumbNodeArray+') MUST be array.');
		return;
	}

	if(photoArray.length != thumbNodeArray.length){
		throw new Error(this+' photoArray ('+photoArray.length+') and thumbNodeArray ('+thumbNodeArray.length+') MUST have the same number of items.');
		return;
	}
	
	if(!TypeVerifier.isNode(bigPhotoNode)){
		throw new Error(this+' bigPhotoNode ('+bigPhotoNode+') MUST be a xhtml node.');
		return;
	}
	
	if(bigPhotoNode.nodeName != 'IMG'){
		throw new Error(this+' bigPhotoNode ('+bigPhotoNode+') MUST be a IMG type node.');
		return;
	}
	
	// declare
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _photoCarret = new PhotoCarret(photoArray);
	var _this = this;
	var _thumbNodeArray = thumbNodeArray;
	var _bigPhotoNode = bigPhotoNode;
	var _photosToLoad = {};
	
	// getters
	this.getPhotoCarret = function(){
		return _photoCarret;
	};
	
	// private methods
	var _applyButtonListeners = function(node, index){
		if(node.href){
			node.href = 'javascript:;';
			node.target = '_self';
		}
		addEvent(node, 'click', function(){
			_photoCarret.go(index);
		});
	};
	var _onSelectItem = function(e){
		_listenerManager.dispatchEvent(_this, cct.site.PhotoGallery.EVENT_SELECT_THUMB, {
			node: _thumbNodeArray[e.extra.index]
		});
		_unselectItems(e.extra.index);
		//if(!_photosToLoad[e.extra.photo]){ // burro por causa do IE6
			_photosToLoad[e.extra.photo] = new ImageLoader(e.extra.photo);
			_listenerManager.addEventListener(_photosToLoad[e.extra.photo], defaultEvents.ON_LOAD, _onLoadImage);
			_photosToLoad[e.extra.photo].load();
		/*
		}else{
			_onLoadImage({
				extra:{
					image: {
						src: e.extra.photo
					}
				}
			});
		}
		*/
	};
	var _unselectItems = function(index){
		for(var i=0; i<_thumbNodeArray.length; i++){
			if(index != i){
				_listenerManager.dispatchEvent(_this, cct.site.PhotoGallery.EVENT_UNSELECT_THUMB, {
					node: _thumbNodeArray[i]
				});
			}
		}
	};
	var _onLoadImage = function(e){
		_bigPhotoNode.src = e.extra.image.src;
		Log.info(_this+" _bigPhotoNode.src: "+_bigPhotoNode.src);
	};
	
	// public methods
	this.go = function(index){
		_photoCarret.go(index);
	};
	this.previous = function(){
		_photoCarret.previous();
	};
	this.next = function(){
		_photoCarret.next();
	};
	this.selectPhotoByIndex = function(index){
		var photoURL = _photoCarret.getPhotoByIndex(index);
		if(!photoURL)
			return;
		
		var extra = {
			index: index,
			total: _photoCarret.getCarret().getTotal()
		};
		
		if(index == 0){
			_listenerManager.dispatchEvent(_photoCarret, CarretManager.EVENT_FIRST_ITEM, extra);
		}else if (index == extra.total){
			_listenerManager.dispatchEvent(_photoCarret, CarretManager.EVENT_LAST_ITEM, extra);
		}else{
			_listenerManager.dispatchEvent(_photoCarret, CarretManager.EVENT_MIDDLE_ITEM, extra);
		}
		
		_photoCarret.getCarret().setLooseIndex(index);
		
		_photosToLoad[photoURL] = new ImageLoader(photoURL);
		_listenerManager.addEventListener(_photosToLoad[photoURL], defaultEvents.ON_LOAD, _onLoadImage);
		_photosToLoad[photoURL].load();
	};
	
	// contruct
	this.init = function(){
		_listenerManager.addEventListener(_photoCarret, CarretManager.EVENT_ANY_ITEM, _onSelectItem);
		for(var i=0; i< _thumbNodeArray.length; i++){
			_applyButtonListeners(_thumbNodeArray[i], i);
		}
		_photoCarret.init();
	};
};
cct.site.PhotoGallery.EVENT_SELECT_THUMB = "eventSelectThumb";
cct.site.PhotoGallery.EVENT_UNSELECT_THUMB = "eventUnselectThumb";
cct.site.PhotoGallery.prototype.toString = function(){
	return '[cct.site.PhotoGallery]';
};


cct.site.ProductPhotoGallery = function(photoArray, thumbNodeArray, bigPhotoNode, btPrevious, btNext){
	
	// classes alias
	var PhotoGallery = cct.site.PhotoGallery;
	var CarretManager = cct.utils.CarretManager;
	
	// declare
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _this = this;
	var _btPrevious = btPrevious;
	var _btNext = btNext;
	var _photoGallery = new PhotoGallery(photoArray, thumbNodeArray, bigPhotoNode);
	
	// getters
	this.getPhotoGallery = function(){
		return _photoGallery;
	};
	
	// private methods
	var _verifyArrows = function(e){
		if(_btPrevious.className.match(/off/))
			_btPrevious.className = _btPrevious.className.replace(/off/, 'on');
		
		if(_btNext.className.match(/off/))
			_btNext.className = _btNext.className.replace(/off/, 'on');
	};
	
	// construct
	
	// on / off thumbs
	_listenerManager.addEventListener(_photoGallery, PhotoGallery.EVENT_SELECT_THUMB, function(e){
		e.extra.node.className = e.extra.node.className.replace(/off/, 'on');
	});
	_listenerManager.addEventListener(_photoGallery, PhotoGallery.EVENT_UNSELECT_THUMB, function(e){
		e.extra.node.className = e.extra.node.className.replace(/on/, 'off');
	});
	
	// carret handlers
	_listenerManager.addEventListener(_photoGallery.getPhotoCarret(), CarretManager.EVENT_MIDDLE_ITEM, _verifyArrows);
	_listenerManager.addEventListener(_photoGallery.getPhotoCarret(), CarretManager.EVENT_FIRST_ITEM, function(e){
		_verifyArrows(e);
		_btPrevious.className = _btPrevious.className.replace(/on/, 'off');
	});
	_listenerManager.addEventListener(_photoGallery.getPhotoCarret(), CarretManager.EVENT_LAST_ITEM,  function(e){
		_verifyArrows(e);
		_btNext.className = _btNext.className.replace(/on/, 'off');
	});
	_listenerManager.addEventListener(_photoGallery.getPhotoCarret(), CarretManager.EVENT_ANY_ITEM, function(e){
		_listenerManager.dispatchEvent(_this, CarretManager.EVENT_ANY_ITEM, e.extra);
	});
	
	// event handlers
	addEvent(_btPrevious, 'click', function(){
		_photoGallery.getPhotoCarret().previous();
	});
	addEvent(_btNext, 'click', function(){
		_photoGallery.getPhotoCarret().next();
	});
	
	// init
	_photoGallery.init();
};

/*
	PACKAGE 'SHORTCUTS'
*/

if(!cct.site.shortcuts)
	cct.site.shortcuts = {};

cct.site.shortcuts.productPhotoGallery = function(){
	var photoSelector = gClass('photoSelector')[0];

	// arrows elements
	var arrowLeft = document.createElement('a');
	var arrowRight = document.createElement('a');
		arrowLeft.href = arrowRight.href = 'javascript:;';
		arrowLeft.className = 'leftArrow on';
		arrowRight.className = 'rightArrow on';

	// init photo gallery class
	var _listenerManager = cct.events.ListenerManager.getInstance();
	var _thumbsImgArray = gTag('a', photoSelector);
	var _thumbsImgNode = [];
	var _photoArray = [];
	for(var i=0; i<_thumbsImgArray.length; i++){
		_thumbsImgNode[_thumbsImgNode.length] = _thumbsImgArray[i];
		_photoArray[_photoArray.length] = _thumbsImgArray[i].href;
	}
	
	// add arrows to view
	photoSelector.insertBefore(arrowLeft, photoSelector.firstChild);
	photoSelector.insertBefore(arrowRight, photoSelector.firstChild);
	
	// construct
	// photoGallery
	var productPhotoGallery = new cct.site.ProductPhotoGallery(
		_photoArray,
		_thumbsImgNode,
		gTag('img', gClass('photoHolder')[0])[0],
		arrowLeft,
		arrowRight
	);
	
	// photoZoomGallery
	var productPhotoGalleryZoom = new cct.site.ProductPhotoGallery(
		_photoArray,
		_thumbsImgNode,
		$('zoomImagePop'),
		$('popPrevious'),
		$('popNext')
	);
	
	// photoZoomGallery integration
	addEvent($('callZoom'), 'click', function(){
		openBox('imagePop');
	});
	addEvent($('closeImagePop'), 'click', function(){
		closeBox('imagePop');
	});
	_listenerManager.addEventListener(productPhotoGallery, cct.utils.CarretManager.EVENT_ANY_ITEM, function(e){
		productPhotoGalleryZoom.getPhotoGallery().go(e.extra.index);
	});
	_listenerManager.addEventListener(productPhotoGalleryZoom, cct.utils.CarretManager.EVENT_ANY_ITEM, function(e){
		productPhotoGallery.getPhotoGallery().selectPhotoByIndex(e.extra.index);
	});
};

cct.site.shortcuts.GiftList = function(node){
	var _this = this;
	_this.node = node;
	if(!_this.node) return;

	_this.sendButton = gTag('a', gClass('botaoComprar', '*', _this.node)[0])[0];
	var matchedId = _this.sendButton.href.match(/id=(.[^&]*)/);
	_this.id = matchedId != null ? matchedId[1] || 'not-set' : 'not-set';
	
	_this.select = function(){
		_this.node.className += ' selected';
		_this.selected = true;
	}
	_this.unselect = function(){
		_this.node.className = _this.node.className.replace(/(?:\s+)?selected(?:\s+)?/, ' ');
		_this.selected = false;
	}
	_this.getSelectedStatus = function(){
		if(_this.node.className.match(/(?:\s+)?selected(?:\s+)?/)){
			_this.selected = true;
		}else{
			_this.selected = false;
		}
	}
	
	_this.sendButton.href = 'javascript:;';
	_this.getSelectedStatus();
};
cct.site.shortcuts.manageGiftList = function(data){
	var GiftList = cct.site.shortcuts.GiftList;
	
	var nodeList = data.liNodeList || [];
	var gifts = [];
	var address = data.addressToPost;
	
	var sendData = function(gift){
		ajaxRun({
			url: address,
			debug: data.debug,
			encrypt: false,
			parameters: {
				id: gift.id,
				type: !gift.selected ? 'add' : 'remove'
			},
			onFinish: function(r,e){
				r = eval(r);
				if(r){
					if(r[0]){
						if(!gift.selected){
							gift.select();
						}else{
							gift.unselect();
						}
					}else{
						alert(unescape(r[1]));
					}
				}
			}
		});
	};
	
	var applyHandlers = function(gift){
		addEvent(gift.sendButton, 'click', function(){
			sendData(gift);
		});
	};
	
	var init = function(){
		for (var i=0; i < nodeList.length; i++) {
			gifts[i] = new GiftList(nodeList[i]);
			applyHandlers(gifts[i]);
		};
	};
	
	if(window['ajaxRun']){
		init();
	}
	
};

/**
 * Simple help bubble
 */
cct.site.shortcuts.simpleHelpBubble = function(elms){
	var applyHandlers = function(elm){
		var link = gTag('a', elm)[0];
		var helpBox = gClass("helpContent", null, elm)[0];
		
		link.href = 'javascript:;';
		hDiv(helpBox);
		addEvent(link, 'mouseover', function(){
			sDiv(helpBox);
		});
		addEvent(link, 'mouseout', function(){
			hDiv(helpBox);
		});
	};
	for (var i=0; i < elms.length; i++) {
		applyHandlers(elms[i]);
	};
};

/**
 * Applies search Zip Code using ajax to the 'cadastro' form
 */
cct.site.shortcuts.applyBuscaCEP = function(objData){
	addEvent(objData.buscaButton, 'click', function(){
		var statusMessage = function(msg){
			objData.statusMessage.className = $('cepStatus').className.replace(/txtErro/,'');
			objData.statusMessage.innerHTML = msg;
		};
		var errorMessage = function(msg){
			objData.statusMessage.className += objData.statusMessage.className.match(/txtErro/) ? '' : ' txtErro';
			objData.statusMessage.innerHTML = msg;
		};
		if(objData.cep1.value.length < 5 || objData.cep2.value.length < 3){
			errorMessage("Preencha o campo CEP corretamente.");
			return;
		}

		hDiv(objData.buscaButton);
		statusMessage('enviando...');
		ajaxRun({
			url: objData.url,
			debug: objData.debug,
			method: 'get',
			encrypt: false,
			parameters: {
				cep: objData.cep1.value+'-'+objData.cep2.value
			},
			onFinish: function(r,e){
				statusMessage('');
				sDiv(objData.buscaButton);
				var addressData = cct.utils.parseCSV(r) ? cct.utils.parseCSV(r)[0] : null;
				if(addressData != null){
					objData.endereco.value = [
						addressData.tipo_logradouro,
						addressData.logradouro
					].join(' ');
					objData.bairro.value = addressData.bairro;
					objData.cidade.value = addressData.cidade;
					objData.estado.value = addressData.sigla;
				}else{
					errorMessage('CEP não encontrado.');
				}
			},
			onError: function(r,e){
				sDiv(objData.buscaButton);
				errorMessage('CEP não encontrado.');
			}
		});
	});
};


/**
 * Validações
 */
cct.site.shortcuts.validateCadastro = function(fldToVal){
	
	var frmVal = new frmValidator(fldToVal.form);
	var applyValidations = function(){
		frmVal.clearAllValidations();
        
        if(fldToVal.fldApelido){frmVal.amv(fldToVal.fldApelido, 'req', 'maxlen='+$(fldToVal.fldApelido).maxLength, 'minlen=3');}
		if(fldToVal.fldNome){frmVal.amv(fldToVal.fldNome, 'req', 'maxlen='+$(fldToVal.fldNome).maxLength, 'minlen=3');}
		if(fldToVal.fldCEP1){frmVal.amv(fldToVal.fldCEP1, 'req', 'number', 'maxlen='+$(fldToVal.fldCEP1).maxLength, 'minlen='+$(fldToVal.fldCEP1).maxLength);}
		if(fldToVal.fldCEP2){frmVal.amv(fldToVal.fldCEP2, 'req', 'number', 'maxlen='+$(fldToVal.fldCEP2).maxLength, 'minlen='+$(fldToVal.fldCEP2).maxLength);}
		if(fldToVal.fldEndereco){frmVal.amv(fldToVal.fldEndereco, 'req', 'maxlen='+$(fldToVal.fldEndereco).maxLength, 'minlen=6');}
		if(fldToVal.fldNumero){frmVal.amv(fldToVal.fldNumero, 'req', 'maxlen='+$(fldToVal.fldNumero).maxLength);}
		if(fldToVal.fldComplemento){frmVal.amv(fldToVal.fldComplemento, 'maxlen='+$(fldToVal.fldComplemento).maxLength);}
		if(fldToVal.fldBairro){frmVal.amv(fldToVal.fldBairro, 'req', 'maxlen='+$(fldToVal.fldBairro).maxLength);}
		if(fldToVal.fldCidade){frmVal.amv(fldToVal.fldCidade, 'req', 'maxlen='+$(fldToVal.fldCidade).maxLength);}
		if(fldToVal.cbEstado){frmVal.av(fldToVal.cbEstado, 'dontselect=0');}
		if(fldToVal.fldRG){frmVal.amv(fldToVal.fldRG, 'req', 'maxlen='+$(fldToVal.fldRG).maxLength, 'minlen=5');}
		if(fldToVal.fldCPF){frmVal.amv(fldToVal.fldCPF, 'req', 'maxlen='+$(fldToVal.fldCPF).maxLength, 'minlen='+$(fldToVal.fldCPF).maxLength, 'cpf');}
		if(fldToVal.fldDiaNasc){frmVal.amv(fldToVal.fldDiaNasc, 'req', 'maxlen='+$(fldToVal.fldDiaNasc).maxLength, 'number');}
		if(fldToVal.fldMesNasc){frmVal.amv(fldToVal.fldMesNasc, 'req', 'maxlen='+$(fldToVal.fldMesNasc).maxLength, 'number');}
		if(fldToVal.fldAnoNasc){frmVal.amv(fldToVal.fldAnoNasc, 'req', 'maxlen='+$(fldToVal.fldAnoNasc).maxLength, 'minlen='+$(fldToVal.fldAnoNasc).maxLength, 'number');}
		if(fldToVal.fldEmail){
			frmVal.amv(fldToVal.fldEmail, 'req', 'email', 'maxlen='+$(fldToVal.fldEmail).maxLength, 'minlen=5');
			frmVal.av(fldToVal.fldEmailConfirma, 'equal='+fldToVal.fldEmail);
		}
		if(fldToVal.fldSenha){
			frmVal.amv(fldToVal.fldSenha, 'req', 'maxlen='+$(fldToVal.fldSenha).maxLength, 'minlen=6');
			frmVal.av(fldToVal.fldSenhaConfirma, 'equal='+fldToVal.fldSenha);
		}
		if(fldToVal.fldTelefoneDDD){frmVal.amv(fldToVal.fldTelefoneDDD, 'req', 'number', 'maxlen='+$(fldToVal.fldTelefoneDDD).maxLength, 'minlen='+$(fldToVal.fldTelefoneDDD).maxLength);}
		if(fldToVal.fldTelefoneNumero){frmVal.amv(fldToVal.fldTelefoneNumero, 'req', 'number', 'maxlen='+$(fldToVal.fldTelefoneNumero).maxLength, 'minlen=7');}
		if(fldToVal.fldCelularDDD){frmVal.amv(fldToVal.fldCelularDDD, 'number', 'maxlen='+$(fldToVal.fldCelularDDD).maxLength);}
		if(fldToVal.fldCelularNumero){frmVal.amv(fldToVal.fldCelularNumero, 'number', 'maxlen='+$(fldToVal.fldCelularNumero).maxLength);}
		if(fldToVal.fldApelidoParceiro){frmVal.amv(fldToVal.fldApelidoParceiro, 'req', 'maxlen='+$(fldToVal.fldApelidoParceiro).maxLength);}
		if(fldToVal.fldNomeParceiro){frmVal.amv(fldToVal.fldNomeParceiro, 'req', 'maxlen='+$(fldToVal.fldNomeParceiro).maxLength, 'minlen=3');}
		if(fldToVal.fldDiaCasamento){frmVal.amv(fldToVal.fldDiaCasamento, 'req', 'maxlen='+$(fldToVal.fldDiaCasamento).maxLength, 'number');}
		if(fldToVal.fldMesCasamento){frmVal.amv(fldToVal.fldMesCasamento, 'req', 'maxlen='+$(fldToVal.fldMesCasamento).maxLength, 'number');}
		if(fldToVal.fldAnoCasamento){frmVal.amv(fldToVal.fldAnoCasamento, 'req', 'maxlen='+$(fldToVal.fldAnoCasamento).maxLength, 'minlen='+$(fldToVal.fldAnoCasamento).maxLength, 'number');}
	};
	
	var onlyNumFnc = function(evt){return only('num', null, evt);};
	var jumpFnc = function(evt){jump(this, evt);};
	
	// restrict / jump / mask
	
	if(fldToVal.fldCPF){$(fldToVal.fldCPF).onkeypress = onlyNumFnc;}
	//if(fldToVal.fldRG){$(fldToVal.fldRG).onkeypress = onlyNumFnc;}
	if(fldToVal.fldDiaCasamento){$(fldToVal.fldDiaCasamento).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMesCasamento){$(fldToVal.fldMesCasamento).onkeypress = onlyNumFnc;}
	if(fldToVal.fldAnoCasamento){$(fldToVal.fldAnoCasamento).onkeypress = onlyNumFnc;}
	if(fldToVal.fldDiaNasc){$(fldToVal.fldDiaNasc).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMesNasc){$(fldToVal.fldMesNasc).onkeypress = onlyNumFnc;}
	if(fldToVal.fldAnoNasc){$(fldToVal.fldAnoNasc).onkeypress = onlyNumFnc;}
	if(fldToVal.fldCelularNumero){$(fldToVal.fldCelularNumero).onkeypress = onlyNumFnc;}
	if(fldToVal.fldCelularDDD){$(fldToVal.fldCelularDDD).onkeypress = onlyNumFnc;}
	if(fldToVal.fldTelefoneNumero){$(fldToVal.fldTelefoneNumero).onkeypress = onlyNumFnc;}
	if(fldToVal.fldTelefoneDDD){$(fldToVal.fldTelefoneDDD).onkeypress = onlyNumFnc;}
	if(fldToVal.fldCEP2){$(fldToVal.fldCEP2).onkeypress = onlyNumFnc;}
	if(fldToVal.fldCEP1){$(fldToVal.fldCEP1).onkeypress = onlyNumFnc;}

    //if(fldToVal.fldCPF){
	//	$(fldToVal.fldCPF).onkeypress = function(e){cct.utils.mask('CPF', $(fldToVal.fldCPF), e)};
	//}
	

	//if(fldToVal.fldRG){$(fldToVal.fldRG).onkeyup = jumpFnc;}
	if(fldToVal.fldCPF){$(fldToVal.fldCPF).onkeyup = jumpFnc;}
	if(fldToVal.fldDiaCasamento){$(fldToVal.fldDiaCasamento).onkeyup = jumpFnc;}
	if(fldToVal.fldMesCasamento){$(fldToVal.fldMesCasamento).onkeyup = jumpFnc;}
	if(fldToVal.fldAnoCasamento){$(fldToVal.fldAnoCasamento).onkeyup = jumpFnc;}
	if(fldToVal.fldDiaNasc){$(fldToVal.fldDiaNasc).onkeyup = jumpFnc;}
	if(fldToVal.fldMesNasc){$(fldToVal.fldMesNasc).onkeyup = jumpFnc;}
	if(fldToVal.fldAnoNasc){$(fldToVal.fldAnoNasc).onkeyup = jumpFnc;}
	if(fldToVal.fldCelularNumero){$(fldToVal.fldCelularNumero).onkeyup = jumpFnc;}
	if(fldToVal.fldCelularDDD){$(fldToVal.fldCelularDDD).onkeyup = jumpFnc;}
	if(fldToVal.fldTelefoneNumero){$(fldToVal.fldTelefoneNumero).onkeyup = jumpFnc;}
	if(fldToVal.fldTelefoneDDD){$(fldToVal.fldTelefoneDDD).onkeyup = jumpFnc;}
	if(fldToVal.fldCEP2){$(fldToVal.fldCEP2).onkeyup = jumpFnc;}
	if(fldToVal.fldCEP1){$(fldToVal.fldCEP1).onkeyup = jumpFnc;}
	
	// init
	applyValidations();
};

cct.site.shortcuts.validateLogin = function(fldToVal){
	frmVal = new frmValidator(fldToVal.form.id);
	var initLoginValue = fldToVal.loginText;
	var applyValidations = function(){
		frmVal.clearAllValidations();
		frmVal.amv(fldToVal.loginField.id, 'req', 'email', 'maxlen='+fldToVal.loginField.maxLength);
		frmVal.amv(fldToVal.senhaField.id, 'req', 'maxlen='+fldToVal.senhaField.maxLength);
		frmVal.customValidation(function(){
			if(initLoginValue)
				if(initLoginValue == fldToVal.loginField.value.replace(/(^\s+|\s+$)/g,'')){
					alert('O campo \"' + fldToVal.loginField.title + '\" é obrigatório.')
					return false;
				}
			return true;
		});
	};
	
	cct.site.shortcuts.inputLabel(fldToVal.loginField, initLoginValue);
	cct.site.shortcuts.submitForm(
		[fldToVal.loginField, fldToVal.senhaField],
		fldToVal.sendButton,
		applyValidations,
		fldToVal.form
	);
};
cct.site.shortcuts.validateRSVP = function(fldToVal){
	frmVal = new frmValidator(fldToVal.form.id);

	var onlyNumFnc = function(evt){return only('num', null, evt);};
	var jumpFnc = function(evt){jump(this, evt);};
	
	if(fldToVal.qtdAdultos){fldToVal.qtdAdultos.onkeypress = onlyNumFnc;}
	if(fldToVal.qtdCriancas){fldToVal.qtdCriancas.onkeypress = onlyNumFnc;}

	if(fldToVal.qtdAdultos){fldToVal.qtdAdultos.onkeyup = jumpFnc;}
	if(fldToVal.qtdCriancas){fldToVal.qtdCriancas.onkeyup = jumpFnc;}

	var applyValidations = function(){
		frmVal.clearAllValidations();
		frmVal.amv(fldToVal.nome.id, 'req', 'maxlen='+fldToVal.nome.maxLength);
		frmVal.amv(fldToVal.email.id, 'req', 'email', 'maxlen='+fldToVal.email.maxLength);
		frmVal.av(fldToVal.presenca, 'selone');
		frmVal.amv(fldToVal.qtdAdultos.id, 'req', 'num', 'maxlen='+fldToVal.qtdAdultos.maxLength);
		frmVal.amv(fldToVal.qtdCriancas.id, 'req', 'num', 'maxlen='+fldToVal.qtdCriancas.maxLength);
	};
	
	cct.site.shortcuts.submitForm([
			fldToVal.nome,
			fldToVal.email,
			fldToVal.qtdAdultos,
			fldToVal.qtdCriancas
		],
		fldToVal.sendButton,
		applyValidations,
		fldToVal.form
	);
};

cct.site.shortcuts.validateWebsiteLocal = function(fldToVal){
	
	var frmVal = new frmValidator(fldToVal.form);
	var applyValidations = function(){
		frmVal.clearAllValidations();
	};
	
	var onlyNumFnc = function(evt){return only('num', null, evt);};
	var jumpFnc = function(evt){jump(this, evt);};
	
	// restrict / jump / mask
	
	if(fldToVal.fldDiaCerimonia){$(fldToVal.fldDiaCerimonia).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMesCerimonia){$(fldToVal.fldMesCerimonia).onkeypress = onlyNumFnc;}
	if(fldToVal.fldAnoCerimonia){$(fldToVal.fldAnoCerimonia).onkeypress = onlyNumFnc;}
	if(fldToVal.fldHoraCerimonia){$(fldToVal.fldHoraCerimonia).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMinutoCerimonia){$(fldToVal.fldMinutoCerimonia).onkeypress = onlyNumFnc;}
	if(fldToVal.fldDiaFesta){$(fldToVal.fldDiaFesta).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMesFesta){$(fldToVal.fldMesFesta).onkeypress = onlyNumFnc;}
	if(fldToVal.fldAnoFesta){$(fldToVal.fldAnoFesta).onkeypress = onlyNumFnc;}
	if(fldToVal.fldHoraFesta){$(fldToVal.fldHoraFesta).onkeypress = onlyNumFnc;}
	if(fldToVal.fldMinutoFesta){$(fldToVal.fldMinutoFesta).onkeypress = onlyNumFnc;}

	if(fldToVal.fldDiaCerimonia){$(fldToVal.fldDiaCerimonia).onkeyup = jumpFnc;}
	if(fldToVal.fldMesCerimonia){$(fldToVal.fldMesCerimonia).onkeyup = jumpFnc;}
	if(fldToVal.fldAnoCerimonia){$(fldToVal.fldAnoCerimonia).onkeyup = jumpFnc;}
	if(fldToVal.fldHoraCerimonia){$(fldToVal.fldHoraCerimonia).onkeyup = jumpFnc;}
	if(fldToVal.fldMinutoCerimonia){$(fldToVal.fldMinutoCerimonia).onkeyup = jumpFnc;}
	if(fldToVal.fldDiaFesta){$(fldToVal.fldDiaFesta).onkeyup = jumpFnc;}
	if(fldToVal.fldMesFesta){$(fldToVal.fldMesFesta).onkeyup = jumpFnc;}
	if(fldToVal.fldAnoFesta){$(fldToVal.fldAnoFesta).onkeyup = jumpFnc;}
	if(fldToVal.fldHoraFesta){$(fldToVal.fldHoraFesta).onkeyup = jumpFnc;}
	if(fldToVal.fldMinutoFesta){$(fldToVal.fldMinutoFesta).onkeyup = jumpFnc;}	
	
	// init
	applyValidations();
};


/**
 * Form utils
 */
cct.site.shortcuts.passLabel = {
	_fieldNode: null,
	_labelNode: null,
	_labelValue: '',
	_eventOn:function(){
		var _this = cct.site.shortcuts.passLabel;
		hDiv(_this._labelNode);
	},
	_eventOff:function(){
		var _this = cct.site.shortcuts.passLabel;
		if(_this._fieldNode.value == '' || _this._fieldNode.value.match(/^\s+$/)){
			_this._fieldNode.value = '';
			sDiv(_this._labelNode);
		}
	},
	apply: function(fieldNode, labelNode, labelText){
		this._fieldNode = fieldNode;
		this._labelNode = labelNode;
		this._labelValue = labelText;
		this._labelNode.className += ' label';
		this._labelNode.innerHTML = this._labelValue;
		addEvent(fieldNode, 'focus', cct.site.shortcuts.passLabel._eventOn);
		addEvent(fieldNode, 'blur', cct.site.shortcuts.passLabel._eventOff);
		addEvent(labelNode, 'click', cct.site.shortcuts.passLabel._eventOn);
	}
};
cct.site.shortcuts.inputLabel = function(input, initValue){
	var applyInitValue = function(){
		if(initValue == input.value.replace(/(^\s+|\s+$)/g,'') || input.value.match(/(?:^\s+$|^$)/))
			input.className += ' label';
		leaveMe(input, initValue);
	};
	addEvent(input, 'focus', function(){
		clearMe(input, initValue);
		input.className = input.className.replace(/\s?label/, '');
	});
	addEvent(input, 'blur', applyInitValue);
	applyInitValue();
};
cct.site.shortcuts.submitForm = function(fieldsArray, sendButton, applyValidationFunction, form){
	var applyValidations = function(){
		if(applyValidationFunction)
			applyValidationFunction();
	};
	var sendForm = function(){
		applyValidations();
		if(form.onsubmit){
			if(form.onsubmit())
				form.submit();
		}else{
			form.submit();
		}
	};
	var sendOnKeyPress = function(e){
		if (!e) var e = window.event;
			e.cancelBubble = true;
			if (e.stopPropagation) e.stopPropagation();
		if(e.keyCode == 13)
			sendForm();
	}
	
	addEvent(sendButton, 'click', function(){sendForm();});
	for (var i=0; i < fieldsArray.length; i++) {
		addEvent(fieldsArray[i], 'keypress', sendOnKeyPress);
	};
};;
